package com.algorithm.ch1.hf.array;

/**
 * 给定一个数组，将数组中的元素向右移动 k 个位置，其中 k 是非负数。

 示例 1:

 输入: [1,2,3,4,5,6,7] 和 k = 3
 输出: [5,6,7,1,2,3,4]
 解释:
 向右旋转 1 步: [7,1,2,3,4,5,6]
 向右旋转 2 步: [6,7,1,2,3,4,5]
 向右旋转 3 步: [5,6,7,1,2,3,4]
 示例 2:

 输入: [-1,-100,3,99] 和 k = 2
 输出: [3,99,-1,-100]
 解释:
 向右旋转 1 步: [99,-1,-100,3]
 向右旋转 2 步: [3,99,-1,-100]
 说明:

 尽可能想出更多的解决方案，至少有三种不同的方法可以解决这个问题。
 要求使用空间复杂度为 O(1) 的原地算法。
 */
public class Rotate {

    public static void main(String[] args) {
        int[] nums = new int[]{7,1,2,3,4,5,6};//3456 712
        int point = 4;

        if(point < 0 || point > nums.length) {
            throw new RuntimeException("illegal params...");
        }

        int[] a = xuanzhuan1(nums,point);
        System.out.print("method one:");
        for(int i = 0; i < a.length ; i++) {
            System.out.print(a[i]+",");
        }
        System.out.println("");

        int[] b = xuanzhuan2(nums,point);
        System.out.print("method two:");
        for(int i = 0; i < b.length ; i++) {
            System.out.print(b[i]+",");
        }
        System.out.println("");

        int[] c = xuanzhuan3(nums,point);
        System.out.print("method three:");
        for(int i = 0; i < c.length ; i++) {
            System.out.print(c[i]+",");
        }
    }

    public static int[] xuanzhuan1(int[] nums,int point){
        //新数组
        int[] ints = new int[nums.length];
        for(int i = 0;i<nums.length;i++) {
           if(i < point) {
               ints[i] = nums[nums.length - point + i];
           } else {
               ints[i] = nums[i - point];
           }
        }
        return  ints;
    }

    public static int[] xuanzhuan2(int[] nums,int point){
        //原数组操作
        // 4
        //{7,1,2,3,4,5,6}
        // 0 1 2 3 4 5 6
        // 4 5 6 0 1 2 3
        for(int i = 0;i < point;i++) {
            int temp = nums[nums.length - 1];
            for(int a = nums.length - 1;a > 0;a--) {
                nums[a] = nums[a - 1];
            }
            nums[0] = temp;
        }
        return nums;
    }

    public static int[] xuanzhuan3(int[] nums,int point){


        return nums;
    }
}
